package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.config.VodConstantProperties;
import com.atguigu.tingshu.album.service.VodService;
import com.atguigu.tingshu.common.util.UploadFileUtil;
import com.atguigu.tingshu.vo.album.TrackMediaInfoVo;
import com.atguigu.tingshu.vo.album.UploadTrackVo;
import com.qcloud.vod.VodUploadClient;
import com.qcloud.vod.model.VodUploadRequest;
import com.qcloud.vod.model.VodUploadResponse;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;

import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.*;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import lombok.extern.slf4j.XSlf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

@Slf4j
@Service
public class VodServiceImpl implements VodService {

    @Autowired
    private VodConstantProperties vodConstantProperties;

    /**
     * 上传音频文件
     *
     * @param file 要上传的音频文件，类型为MultipartFile
     * @return 上传音频后的结果对象，包含媒体文件ID和媒体URL
     * @throws Exception 上传过程中发生的异常
     */
    @Override
    public UploadTrackVo uploadTrack(MultipartFile file) {
        // 生成临时文件路径
        String tempPath = UploadFileUtil.uploadTempPath(vodConstantProperties.getTempPath(), file);

        // 创建VodUploadClient实例
        VodUploadClient vodUploadClient = new VodUploadClient(vodConstantProperties.getSecretId(), vodConstantProperties.getSecretKey());
        // 创建VodUploadRequest实例
        VodUploadRequest vodUploadRequest = new VodUploadRequest();
        // 设置媒体文件路径
        vodUploadRequest.setMediaFilePath(tempPath);
        // 设置上传流程
        vodUploadRequest.setProcedure(vodConstantProperties.getProcedure());

        try {
            // 执行上传操作
            VodUploadResponse response = vodUploadClient.upload(vodConstantProperties.getRegion(), vodUploadRequest);

            // 获取媒体文件ID
            String fileId = response.getFileId();
            // 获取媒体URL
            String mediaUrl = response.getMediaUrl();

            // 创建UploadTrackVo实例
            UploadTrackVo uploadTrackVo = new UploadTrackVo();
            // 设置媒体文件ID
            uploadTrackVo.setMediaFileId(fileId);
            // 设置媒体URL
            uploadTrackVo.setMediaUrl(mediaUrl);

            // 返回上传结果对象
            return uploadTrackVo;
        } catch (Exception e) {
            // 打印异常堆栈信息
            e.printStackTrace();
            // 返回null表示上传失败
            return null;
        }finally {
            // 删除临时文件
            new File(tempPath).delete();
        }


    }


    /**
     * 根据媒体文件ID获取音频媒体信息
     *
     * @param mediaFileId 媒体文件ID
     * @return TrackMediaInfoVo对象，包含音频媒体的时长、URL、大小和类型信息
     * @throws RuntimeException 如果在获取视频元信息时发生异常，将抛出RuntimeException异常
     */
    @Override
    public TrackMediaInfoVo getTrackMediaInfoById(String mediaFileId) {
        try {
            // 初始化Credential对象，使用从vodConstantProperties获取的SecretId和SecretKey
            // 为了保护密钥安全，建议将密钥设置在环境变量中或者配置文件中，请参考本文凭证管理章节。
            // 硬编码密钥到代码中有可能随代码泄露而暴露，有安全隐患，并不推荐。
            // Credential cred = new Credential("SecretId", "SecretKey");
            Credential cred = new Credential(vodConstantProperties.getSecretId(), vodConstantProperties.getSecretKey());
            // 使用Credential对象创建VodClient实例，并传入区域信息
            VodClient client = new VodClient(cred, vodConstantProperties.getRegion());

            // 创建DescribeMediaInfosRequest请求对象
            DescribeMediaInfosRequest req = new DescribeMediaInfosRequest();
            // 设置请求中需要查询的媒体文件ID数组
            req.setFileIds(new String[]{mediaFileId});
            // 调用VodClient的DescribeMediaInfos方法发送请求，并接收DescribeMediaInfosResponse响应对象
            // 返回的resp是一个DescribeMediaInfosResponse的实例，与请求对象对应
            DescribeMediaInfosResponse resp = client.DescribeMediaInfos(req);
            // 输出json格式的字符串回包
            System.out.println(AbstractModel.toJsonString(resp));

            // 判断响应对象中的媒体信息集合长度是否大于0
            if (resp.getMediaInfoSet().length > 0) {
                // 从响应对象中获取第一个媒体信息对象
                MediaInfo mediaInfo = resp.getMediaInfoSet()[0];
                // 创建TrackMediaInfoVo对象
                TrackMediaInfoVo trackMediaInfoVo = new TrackMediaInfoVo();
                // 设置音频媒体的时长
                trackMediaInfoVo.setDuration(mediaInfo.getMetaData().getDuration());
                // 设置音频媒体的URL
                trackMediaInfoVo.setMediaUrl(mediaInfo.getBasicInfo().getMediaUrl());
                // 设置音频媒体的大小
                trackMediaInfoVo.setSize(mediaInfo.getMetaData().getSize());
                // 设置音频媒体的类型
                trackMediaInfoVo.setType(mediaInfo.getBasicInfo().getType());
                // 返回TrackMediaInfoVo对象
                return trackMediaInfoVo;
            }

            // 如果没有找到对应的媒体信息，则返回null
            return null;
        } catch (TencentCloudSDKException e) {
            // 捕获TencentCloudSDKException异常并打印异常信息
            System.out.println(e.toString());
            // 抛出RuntimeException异常，提示获取视频元信息失败
            throw new RuntimeException("获取视频元信息失败");
        }

    }

    @Override
    @SneakyThrows
    public void removeTrackMediaInfo(String mediaFileId) {
        Credential credential = new Credential(vodConstantProperties.getSecretId(), vodConstantProperties.getSecretKey());
        VodClient client = new VodClient(credential, vodConstantProperties.getRegion());

        DeleteMediaRequest deleteMediaRequest = new DeleteMediaRequest();
        deleteMediaRequest.setFileId(mediaFileId);

        DeleteMediaResponse deleteMediaResponse = client.DeleteMedia(deleteMediaRequest);
        log.info("删除音频媒体信息响应：" + AbstractModel.toJsonString(deleteMediaResponse));


    }

}
